CI(continuous integration) : 持续集成。用来做一些自动化工作,比如程序的打包,单元测试,部署等。
- 我最常用的
git仓库是Github,Travis CI对Github支持的特别好,使用非常方便。- 公司的仓库在
Gitlab上,Gitlab自己内部集成了Gitlab CI。本文主要介绍这两种
CI自动化打包部署flutter apk
Travis CI
Travis CI 与 Github 结合比较紧密,对 GitHub 上的开源Repo是免费的,私有Repo收费。
Travis CI 有两个网址,一个是 travis-ci.org , 另一个是 travis-ci.com 。 官方推荐使用 travis-ci.com , 告诉我们 travis-ci.org 后面会全部迁徙到 travis-ci.com 。 目前在两个网址都可以实现效果,没啥区别,但不能同时使用。
下面以 travis-ci.org 为例,反正我刚开始用的时候就选了这个,索性 “将错就错”
激活要运行 CI 的仓库
使用 github 账号登录 travis-ci.org , 在个人设置中心可以看到自己在 github 上的仓库, 打开对应的开关即可激活。如图: 
.travis.yml
在项目根目录下添加 .travis.yml, travis 提供了多种语言要用的例子, 可以参考这儿。这儿想实现一个 flutter 打包 apk 的 CI , 我们可以参照它提供的 android 例子。 但是 flutter 和 android 都更新的太快了,所以例子上用的都是老的 android 。
这是我的 .travis.yml , 基于最新的 flutter 版本(目前稳定版是 flutter 1.5.4 )与 android28 进行打包。我这儿暂时没有加签名…
1 | os: linux |
每次提交代码后就会自动触发 CI, 可以在 travis-ci.org 下你的仓库中看到。比如我的这个 demo ,可以看到
部署
如果需要自动打包到 github ,我们还需要在 .travis.yml 中添加部署的代码。
本地安装 travis
1 | gem install travis |
生成部署命令
1 | travis setup releases |
会要求你输入你的 github 账号, github 密码,apk 相对于项目根目录的路径,后面的直接选择回车表示 yes 就行了。 结果如图: 
1 | deploy: |
最后: 提交一个打了 tag 的 commit (不然不会触发部署),build 成功之后会自动部署到 github 仓库的 release 下。完整的例子就在我的这个仓库
Gitlab CI
Gitlab Runner
Gitlab Runner 用于跑我们的 CI 脚本并将结果返回给 Gitlab 。
这里我们选择使用 docker 作为我们的 runner 。你也可以选择其他 runner , 比如: macOS 本地、 windows 本地、 linux 本地 … 具体可以看 这儿
安装
我是 macOS 系统,用下面的步骤安装 runner 。其他系统可以查看 官方文档
- 首先要确保你本地有
docker并启动。这儿不再赘述,我已经安装了。 运行
gitlab-runner镜像生成容器,本地找不到此镜像会从网上下载。1
2
3
4docker run -d --name gitlab-runner --restart always \
-v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest大概解释一下:
--name表示为这个容器指定名称,后面的gitlab-runner是我们设定的容器名称。-v表示挂载卷。最后面的
gitlab/gitlab-runner:latest是下载的镜像名。更多 docker 命令 请自行查阅。完成后可以通过
docker ps看到正在运行的docker容器,里面有一个名称为gitlab-runner。
注册
其他系统注册查看 这儿
注册用的
url和token在 仓库——Settings——CI/CD下的Runners——Specific Runners下可以看到,如图:
注册命令
1
docker run --rm -t -i -v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
输入
gitlab实例的url1
2Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://gitlab.ziggurat.cn/输入
token1
2lease enter the gitlab-ci token for this runner
xxx(上面图片中得到的 token )填写描述
1
2Please enter the gitlab-ci description for this runner
flutter build apk填写 tag
1
2Please enter the gitlab-ci tags for this runner (comma separated):
flutter, apk填写执行器
1
2Please enter the executor: docker-ssh+machine, kubernetes, docker-ssh, virtualbox, docker+machine, ssh, docker, parallels, shell:
docker填写执行
CI使用的docker镜像1
2Please enter the Docker image (eg. ruby:2.1):
alpine:latestalpine:latest是一个非常小的docker镜像,linux系统。由于我们一般会在.gitlab-ci.yml中声明docker镜像,而且那个优先级比这儿的高。所以一般填写alpine:latest就行了
这些步骤完成后就可以在上面图片的下面看到你注册成功的 runner, 如图: 
这个命令会在注册完成后运行起来这个 docker 镜像,你可以通过 docker ps 看到。所以图上那个 Runner 是 active 状态。
- 我这儿只能使用
Specific Runners。 我使用的gitlab实例是公司注册的,管理员可以通过设置为某个仓库打开Shared Runners。个人在gitlab.com里开源项目可以直接使用Shared RunnersGitlab Runner只需要安装一次,对于不同项目的CI,可以使用同一个docker镜像,只需要第一次注册一下,后面直接运行就可以了。
.gitlab-ci.yml
在注册完 runner 后,我们需要在项目的根目录下创建一个文件 .gitlab-ci.yml 。 在里面编写将要在 runner 里面执行的命令,完成之后每次提交都会触发我们的 CI 脚本,在仓库的 Pipelines 下就可以看到我们正在跑的 CI。
这儿我们使用 fastlane 给 flutter 项目进行打包。 fastlane 是一个自动构建 Android 和 iOS app 的工具。由于本地打包 iOS 特别麻烦, 而 fastlane 针对两个平台有基本统一的简单操作,flutter 官方也推荐 fastlane 部署。So , 你懂得…
我的 .gitlab-ci.yml 中对于 apk 的打包只有简单的两句, 因为关于 fastlane 的配置文件与脚本我都已经在本地生成并上传了 demo仓库 里面,这儿只实现 Andriod 的无签名打包,感兴趣的可以看 fastlane 相关文件。
.gitlab-ci.yml : 官方语法说明
1 | # 使用此镜像运行打包 |
完成
只要你有新的 push , 在 gitlab 上就会触发 pipeline , 如果正常通过,就应该是这样的: 
由于 .gitlab-ci.yml 有部署命令,所以还可以下载打包好的 apk。 点击右侧的云朵图标就可以看到我们上传的 artifact 了,点击就可以下载了
常见问题
- 新的提交之后没有触发
pipeline
如图,
打开runner的设置页面, 检查一下是否设置了 Run untagged jobs ,我的是这样的:
The Job is stuck because you don’t have any active runners
检查下本地运行的docker容器,正常是有两个,如图:
如果有多余的,删除掉并重启gitlab-runner(这是我们前面注册runner时的容器名称):1
docker restart gitlab-runner
ERROR: Uploading artifacts to coordinator… error
在最后上传包的时候总是报这个错。在经过多次实验以后发现是我司注册的gitlab实例的问题,需要管理员设置允许的artifact大小,可以参考 这儿,我司应该有限制这个。 而我之前创建的仓库就在我司的gitlab实例上,所以导致我的artifact一直上传失败… 真是醉了…最后将
demo转到了 https://gitlab.com , 重新提交,打包和部署都成功。自己也没重新注册runner,直接使用了Shared Runners。当然这个有点限制,对开源项目限制了 2000分钟/月。
总结: CI 是个好东西,可以做好多方便的东西,可以自动化部署博客啊等等。更多精彩,值得探索…



